package mdbs;

import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import model.Cliente;
import model.ItemCotizacion;
import model.ItemVenta;
import model.Venta;
import sessionbeans.AdministradorClientes;
import sessionbeans.AdministradorCotizaciones;
import util.jms.JMSHelper;
import xml.model.FacturaXML;
import xml.model.ItemFacturaXML;
import xml.model.ItemVentaXML;
import xml.model.VentaXML;

import com.thoughtworks.xstream.XStream;

@MessageDriven(activationConfig = {
		@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
		@ActivationConfigProperty(propertyName="destination", propertyValue="queue/remitosOfV5Queue")
})
public class GenerarFacturaMDB implements MessageListener {
		
	final String FACTURA_CLIENTE_QUEUE = "queue/facturasQueue";
	String ipPortCliente = "jnp://172.16.171.13:1099";
	
    @PersistenceContext(unitName = "OficinaVentasPU")
    private EntityManager em;
    
    @EJB
    private AdministradorClientes administradorClientes;
    
    @EJB
	private AdministradorCotizaciones administradorCotizaciones;
	
    public GenerarFacturaMDB() {}
    
    public void onMessage(Message message) {
    	try {
        	TextMessage textMessage = (TextMessage)message;
			String xml = textMessage.getText();
			System.out.println("Recibido el xml: " + xml);
			
			XStream xstream = new XStream();
			xstream.alias("Venta", VentaXML.class);
			xstream.autodetectAnnotations(true);
			VentaXML ventaXML = (VentaXML) xstream.fromXML(xml);//Es el remito
			
			/*Lo que quiero es agregar a la venta los items. El precio es el cotizado, asi
			 * que lo tengo q buscar en la base.*/
			/*VentaXML tiene ItemXML, tengo q comparar ese item con el de la base,
			 * con esIgualAItemCotizacion.
			 * si es igual, agrego itemCotizacion a itemVenta.
			 * La cantidad esta en cada ItemXML de ventaXML.listaItemVenta.
			 * Seteo cantidadVendida de ItemVenta con ese valor*/
			
			/*para cada ItemXML, busco el ItemCotizacion en la base al q es igual,
			 * creo ItemVenta, le seteo el ItemCotizacion y la cantidad de ese ItemXML*/
			List<ItemVenta> itemsVenta = new ArrayList<ItemVenta>();
			
			List<ItemCotizacion> itemsCotizacionVigentes = administradorCotizaciones.obtenerItemsCotizacionesVigentesDeClientePorId(ventaXML.getCliente().getId());
			List<ItemFacturaXML> itemsFactura = new ArrayList<ItemFacturaXML>();
			
			System.out.println("Cant cot vigentes: " + itemsCotizacionVigentes.size());
			Double totalFactura = 0.0;
			Venta venta = new Venta();
			for(ItemVentaXML itemVentaXML : ventaXML.getListaItemVenta()){
				boolean esIgual = false;
				
				for(Iterator<ItemCotizacion> itemCotIterator = itemsCotizacionVigentes.iterator()
						; itemCotIterator.hasNext() && !esIgual ;){
					ItemCotizacion itemCot = itemCotIterator.next();
					if(itemVentaXML.esIgualAItemCotizacion(itemCot) ){
						esIgual = true; //para q salga del bucle
						ItemVenta itemVenta = new ItemVenta();
						itemVenta.setItemCotizado(itemCot);
						itemVenta.setCantidadVendida(itemVentaXML.getCantidad());
						itemVenta.setVenta(venta);
						itemsVenta.add(itemVenta);
						/*le agrego el item venta a la cotizacion osea ya vendi esto*/
						itemCot.getItemsVentas().add(itemVenta);
						totalFactura += itemVenta.getItemCotizado().getPrecioFinal()*itemVenta.getCantidadVendida();
						
						ItemFacturaXML itemFactura = new ItemFacturaXML();
						itemFactura.setCantidad(itemVentaXML.getCantidad());
						itemFactura.setCaracteristicas(itemCot.getCaracteristicas());
						itemFactura.setCodigo(itemCot.getCodigo());
						itemFactura.setMarca(itemCot.getMarca());
						itemFactura.setPaisOrigen(itemCot.getOrigen());
						itemFactura.setPrecioUnitario(itemCot.getPrecioUnitario());
						
						itemsFactura.add(itemFactura);
					}
				}
			}
			Cliente cliente = administradorClientes.obtenerClientePorId(ventaXML.getCliente().getId());
			
			venta.setCliente(cliente);
			venta.setItems(itemsVenta);
			
			em.persist(venta);//ver isi persiste los items_venta tambien
					
						
			/*Generar FacturaXML para cliente*/
			FacturaXML facturaXML = new FacturaXML();
			facturaXML.setDescuento(cliente.getDescuento());
			facturaXML.setFechaFactura(new GregorianCalendar().getTimeInMillis());
			facturaXML.setNroFactura(venta.getId());
			facturaXML.setItems(itemsFactura);			
			facturaXML.setTotalFactura(totalFactura);
			
			XStream xstreamFactura = new XStream();
			xstreamFactura.alias("Factura", FacturaXML.class);
			xstreamFactura.autodetectAnnotations(true);
			String xmlFactura = xstreamFactura.toXML(facturaXML);
			
			System.out.println("\n" + xmlFactura);
			//Envia a cola del cliente
			JMSHelper.sendMessage(xmlFactura, FACTURA_CLIENTE_QUEUE, ipPortCliente);
			
			
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }

}
